package class1;

/**
 * 给定一个参数N,
 * 1! + 2! + 3! + 4！+...+N!的结果
 */
public class Code02_SumOfFactorial {
    public static void main(String[] args) {
        int num = 5;
        long res = f(num);
        System.out.println(res);

        long l = f2(num);
        System.out.println(l);
    }

    public static long f(int n) {
        long sum = 0;
        for (int i = 1; i <= n; i++) {
            sum += factorial(i);
        }
        return sum;
    }

    private static long factorial(int n) {
        long x = 1;
        for (int i = 1; i <= n; i++) {
            x *= i;
        }
        return x;
    }

    /**
     * 效率高的阶乘和
     *
     * @param n
     * @return
     */
    public static long f2(int n) {
        int sum = 0; // 用来存储所有阶乘的和
        int factorial = 1; // 用来存储当前的阶乘值

        /**
         * 第一次循环 (i = 1)：
         *
         * factorial 从 1 开始，计算 1!。公式是 factorial = factorial * 1。
         * 结果：factorial = 1 * 1 = 1。
         * 将 factorial 加到 sum 中：sum = 0 + 1 = 1。
         * 第二次循环 (i = 2)：
         *
         * 计算 2!。公式是 factorial = factorial * 2。
         * 结果：factorial = 1 * 2 = 2。
         * 将 factorial 加到 sum 中：sum = 1 + 2 = 3。
         * 第三次循环 (i = 3)：
         *
         * 计算 3!。公式是 factorial = factorial * 3。
         * 结果：factorial = 2 * 3 = 6。
         * 将 factorial 加到 sum 中：sum = 3 + 6 = 9。
         * 第四次循环 (i = 4)：
         *
         * 计算 4!。公式是 factorial = factorial * 4。
         * 结果：factorial = 6 * 4 = 24。
         * 将 factorial 加到 sum 中：sum = 9 + 24 = 33。
         * 第五次循环 (i = 5)：
         *
         * 计算 5!。公式是 factorial = factorial * 5。
         * 结果：factorial = 24 * 5 = 120。
         * 将 factorial 加到 sum 中：sum = 33 + 120 = 153。
         */
        for (int i = 1; i <= n; i++) {
            factorial = factorial * i;
            sum += factorial;
        }
        return sum;
    }
}
